package com.lktx.sso.admin.service;

import cn.hserver.core.ioc.annotation.Autowired;
import cn.hserver.core.ioc.annotation.Bean;
import cn.hserver.core.ioc.annotation.Value;
import cn.hserver.plugin.web.context.PartFile;
import cn.hserver.plugin.web.interfaces.HttpRequest;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.MD5;
import com.lktx.sso.admin.entity.SsoFiles;
import com.lktx.sso.admin.mapper.SsoFilesMapper;
import com.lktx.sso.system.entity.User;
import com.lktx.sso.system.utils.AuthUtils;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.List;

/**
 * 文件系统 服务类
 */
@Slf4j
@Bean
public class SsoFilesService {

    @Autowired
    private SsoFilesMapper mapper;

    @Value("baseUrl")
    private String baseUrl;

    /**
     * 分页查询列表
     *
     * @param page   分页对象
     * @param entity 查询实体
     * @return 所有数据
     */
    public Page<SsoFiles> page(Page<SsoFiles> page, SsoFiles entity) {
        return mapper.paginate(page, new QueryWrapper()
                .like(SsoFiles::getSuffix, entity.getSuffix(), StrUtil.isNotEmpty(entity.getSuffix()))
                .like(SsoFiles::getFilePath, entity.getFilePath(), StrUtil.isNotEmpty(entity.getFilePath()))
                .like(SsoFiles::getId, entity.getId(), StrUtil.isNotEmpty(entity.getId()))
                .like(SsoFiles::getFileName, entity.getFileName(), StrUtil.isNotEmpty(entity.getFileName()))
                .orderBy(SsoFiles::getId, false)
        );
    }

    /**
     * 不分页查询列表
     *
     * @param entity 实体对象
     * @return 查询结果
     */
    public List<SsoFiles> list(SsoFiles entity) {
        return mapper.selectListByQuery(new QueryWrapper()
                .like(SsoFiles::getSuffix, entity.getSuffix(), StrUtil.isNotEmpty(entity.getSuffix()))
                .like(SsoFiles::getFilePath, entity.getFilePath(), StrUtil.isNotEmpty(entity.getFilePath()))
                .like(SsoFiles::getId, entity.getId(), StrUtil.isNotEmpty(entity.getId()))
                .like(SsoFiles::getFileName, entity.getFileName(), StrUtil.isNotEmpty(entity.getFileName()))
                .orderBy(SsoFiles::getId, false)
        );
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    public SsoFiles getById(String id) {
        return mapper.selectOneById(id);
    }


    /**
     * 新增单条数据
     *
     * @param entity 实体对象
     */
    public void save(SsoFiles entity) {
        mapper.insert(entity);
    }

    /**
     * 修改单条数据
     *
     * @param entity 实体对象
     */
    public void update(SsoFiles entity) {
        mapper.update(entity);
    }

    /**
     * 批量删除数据
     *
     * @param ids 主键集合
     */
    public void deleteByIds(List<String> ids) {
        List<SsoFiles> files = mapper.selectListByIds(ids);
        for (SsoFiles file : files) {
            try {
                File del = FileUtils.delete(new File(file.getFilePath()));
                log.info("{}删除:{}", file.getFilePath(), del);
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }
        }
        mapper.deleteBatchByIds(ids);
    }

    public String uploadFiles(HttpRequest request) {
        String base;
        User user = AuthUtils.getUser();
        if (user != null) {
            base = "." + File.separator + "data" + File.separator + "user" + File.separator + user.getUserId() + File.separator;
        } else {
            base = "." + File.separator + "data" + File.separator + "open" + File.separator;
        }
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(String.format("yyyy%sMM%sdd", File.separatorChar, File.separatorChar));
        String format = simpleDateFormat.format(System.currentTimeMillis());
        PartFile file = request.queryFile("file");
        try {
            if (file == null) {
                return null;
            }
            String id = MD5.create().digestHex(file.getFile());
            SsoFiles byId = getById(id);
            if (byId != null) {
                return baseUrl + "/api/file/" + id;
            }
            String path = base + format + File.separator;
            File file1 = new File(path);
            file1.mkdirs();
            String newFilePath = path + IdUtil.fastUUID() + file.pointExtName();
            file.moveTo(new File(newFilePath));
            SsoFiles files = new SsoFiles();
            files.setSuffix(file.extName());
            files.setFilePath(newFilePath);
            files.setFileName(file.getFileName());
            files.setId(id);
            files.setUrl(baseUrl + "/api/file/" + files.getId());
            this.save(files);
            return files.getUrl();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        } finally {
            if (file != null) {
                file.deleteTempCacheFile();
            }
        }
        return null;
    }
}